import axios, { type AxiosRequestHeaders, type AxiosResponse } from 'axios'
// 导入进度条库
import NProgress from 'nprogress'

/* 定义response对象的data接口 约束response.data的类型 */
// 接口不同 最终返回的数据不同 所以数据是不确定的 定义泛型
interface ResponseData<T> {
    code: number | string
    data: T
    message?: string
}

// 配置新建一个 axios 实例
const yxRequest = axios.create({
    baseURL: '/app', // app-dev || /app-prod
    timeout: 50000
})

// 添加请求拦截器 只写成功的回调不写失败的回调 因为无意义
yxRequest.interceptors.request.use((config) => {
    // 开启、展示进度条
    NProgress.start()
    return config
})

// 添加响应拦截器
yxRequest.interceptors.response.use(
    /* 约束一下response */
    // 使用ResponseData类型 不确定类型所以是any
    async (response: AxiosResponse<ResponseData<any>, any>) => {
        // 关闭、隐藏进度条
        NProgress.done()

        // 对响应数据做点什么
        const res = response.data
        if (res.code == '200') {
            /* 成功数据的code值为20000/200 */
            // 统一的错误提示

            // `token` 过期或者账号已在别处登录

            return res.data
        } else {
            return res.data /* 返回成功响应数据中的data属性数据 */
            // 代表后期写action的时候 发送请求不需要再判断res.code
            // 而res就是我们要的最终数据
        }
    },
    (error) => {
        // 对响应错误做点什么

        return Promise.reject(error)
    }
)

export default yxRequest
